[MachineLearning] 激活函数Activation Function


为什么需要激活函数

神经网络中激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效建模实际环境中非线性分布的数据。加入(非线性)激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。因此,激活函数是深度神经网络中不可或缺的部分。

理想的激活函数是阶跃函数,把输入数据映射为激活(1)和抑制(0)。但阶跃函数的问题是不连续不光滑。这个问题主要反映在计算梯度(求偏导)的过程中。

激活函数常用上图右边的Sigmoid函数。它可以把输入值挤压到(0,1)的范围中。

从Sigmoid能看出一些激活函数的特点,同时还有一些其他特点:

  • 非线性:当激活函数是线性的时候,一个两层的神经网络就可以逼近基本上所有的函数了。但是,如果激活函数是恒等激活函数的时候(即$f(x) = x$ ),就不满足这个性质了,而且如果MLP使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的。
  • 可微性:当优化方法是基于梯度的时候,这个性质是必须的。
  • 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。
  • $f(x) \approx x$:当激活函数满足这个性质的时候,如果参数的初始化是random的很小的值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要很用心的去设置初始值。
  • 输出值的范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate.

激活函数

Sigmoid

最常见的激活函数。

Sigmoid在定义域内处处可导,两侧的倒数逐渐趋近于0,即:$\displaystyle \lim_{x \to \infty}f’(x)=0$.(也称作软饱和激活函数)

Sigmoid导数:

优点:

  • 物理意义上最接近神经元
  • (0,1)的输出可以表示作概率
  • 用于输入的归一化

缺点:

  • 函数不是0均值,而是以(0, 0.5)为中心。这会导致后一层神经元将得到上一层输出的非0均值的信号作为输入。所以数据进入神经元是正的,w计算出的梯度也始终是正的。用batch去训练可以得到不同信号,可以缓解。
  • 在后向传播过程中,sigmoid向下传导的梯度包含了 $f’(x)$ 因子,因此一旦输入落入饱和区,$f’(x)$ 就接近于0,导致向底层传递的梯度变得非常小。这就是所谓的梯度消失。(在反向传播中,会计算每一层的梯度,链式法则相乘。)

一般来说,sigmoid网络在5层之内就产生梯度消失。(sigmoid导数的最大值是0.25,意味着导数每一层至少压缩到原来的1/4,经过5层就非常小了。)

优化办法:后续会发出来介绍

  • DBN的预训练
  • Batch Normalization逐层归一化
  • Xavier和MSRA权重初始化

代表:sigmoid交叉熵损失函数

tanh

tanh实际上是sigmoid的变形:

tanh也有软饱和性,所以也有梯度消失的问题。

由于tanh的输出均值比sigmoid更接近0,SGD会更接近natural gradient,从而降低所需的迭代次数,所以tanh收敛速度比sigmoid更快。

ReLU

ReLU的导数:

虽然2006年Hinton教授提出通过分层无监督预训练解决深层网络训练困难的问题(比如DBN?),但是深度网络的直接监督式训练的最终突破,最主要的原因是采用了新型激活函数ReLU

优点:

  • ReLU函数其实就是max(x, 0)函数,所以计算量比前两者小,计算速度也快。
  • ReLU 在x\<0 时硬饱和。由于 x\>0时导数为 1,所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。
  • 在x<0时结果取0,提供神经网络的稀疏表达能力。(类似dropout缓解过拟合?不过实验验证,ReLU的稀疏性与网络性能之间并不存在绝对正负比关系。)
  • Relu激活函数可以极大地加快收敛速度,相比tanh函数,收敛速度可以加快6倍

缺点:

  • 随着训练推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为神经元死亡
  • 输出具有偏移现象,即输出均值恒大于0

本文作者公开在arxiv的文章中的实验表明,如果不采用Batch Normalization,即使用 MSRA 初始化30层以上的ReLU网络,最终也难以收敛。

关于神经元死亡

比如计算出一个很大的梯度 $\nabla w $,反向传播后 $w - \nabla w$ 使得优化后的 $w$ 变成负数,接着正向传播这个神经元就不会对任何数据有激活现象了。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。

激活函数的选择

由于sigmoid可以看做概率,所以在输出层使用sigmoid比较多。

隐藏层中,ReLU的优秀的计算速度和收敛速度都让其成为一个首选。

ReLU还有很多其他变种,可以参考最后的链接阅读学习。

参考和阅读:

【机器学习】神经网络-激活函数-面面观(Activation Function)

激活函数导引

26种神经网络激活函数可视化


文章作者: Wossoneri
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 Wossoneri !
评论
  目录